import os

import xlrd
from conf import setting
from xlutils.copy import copy
from common.recordlog import logs
import xlwt

# 类内带object表示该类是继承自object基类
class OperationExcel(object):
    """
    封装读取/写入Excel文件的数据
    """
    def __init__(self,filename=None):
        try:
            if filename is not None:
                self.__filename=filename
            else:
                self.__filename=setting.FILE_PATH['EXCEL']
            self.__sheet_id=setting.SHEET_ID
        except Exception as e:
            logs.error(e)
        # 工作表
        self.__GLOBAL_TABLE=self.xls_obj()
        # 不带__：该成员为公共成员，可自由访问和使用
        self.colx=0

    def xls_obj(self):
        xls_obj=''
        if os.path.splitext(self.__filename)[-1]=='.xlsx':
            #打开文件
            data=xlrd.open_workbook(self.__filename,formatting_info=True)
            #获取指定索引的工作表
            xls_obj=data.sheets()[self.__sheet_id]
        else:
            logs.error('Excel文件的格式必须为.xls格式，请重新另存为xls格式！')
            exit()
        return xls_obj

    def get_rows(self):
        """
        获取xls文件总行数
        :return:
        """
        return self.__GLOBAL_TABLE.nrows

    def get_cols(self):
        """
        获取总列数
        :return:
        """
        return self.__GLOBAL_TABLE.ncols

    def get_cell_value(self,row,col):
        """
        获得表中指定单元格的值
        :param row:excel行数，第一行索引为0
        :param col:excel列数，第一列索引为0
        :return:
        """
        return self.__GLOBAL_TABLE.cell_value(row,col)

    def settingStyle(self):
        """
        设置样式
        :return:
        """
        style=xlwt.easyfont("font:bold 1,color red")

    def write_xls_value(self,row,col,value):
        """
        写入数据
        :param row:
        :param col:
        :param value:
        :return:
        """
        try:
            #打开文件
            init_table=xlrd.open_workbook(self.__filename,formatting_info=True)
            """
            为什么需要复制表：
            1、保护原始数据
            2、xlrd本身不支持写操作，xlwt不支持打开现有文件，
            所以需要结合两者并通过复制的方式来实现对已有的Excel文件进行写入的功能
            """
            copy_table=copy(init_table)
            sheet=copy_table.get_sheet(self.__sheet_id)
            #写入
            sheet.write(row,col,value)
            #保存
            copy_table.save(self.__filename)
        except PermissionError:
            logs.error("请先关闭xls文件")
            exit()

    def get_each_line(self,row):
        """
        获取指定行的数据
        :param row:
        :return:
        """
        try:
            return self.__GLOBAL_TABLE.row_values(row)
        except Exception as exp:
            logs.error(exp)

    def get_each_column(self,col=None):
        """
        获取指定列的数据
        :param col:
        :return:
        """
        if col is None:
            return self.__GLOBAL_TABLE.col_values(self.colx)
        else:
            return self.__GLOBAL_TABLE.col_values(col)